'use strict';
/**
 * @name: node封装mongodb
 * @description: 针对于框架进行了封装
 * @version: 0.0.1
 * @author: xiech
 * @Date: 2020-12-10 13:53:30
 * @LastEditors: xiech
 * @LastEditTime: 2020-12-10 13:53:30
 */

module.exports = async (ctx) => {
  const mongodb = ctx.cloud.db;
  if(!mongodb) return;
  const mfmongodb = {};

  /**
   * @description: 增加一条数据
   * @param {string} col 集合
   * @param {object} data 数据
   * @return {id} mongodb返回的ID
   */
  mfmongodb.insertOne = async (col, data) => {
    let result = await mongodb.collection(col).insertOne(data);
    return result.insertedId;
  }

  /**
   * @description: 增加多条数据
   * @param {string} col 集合
   * @param {object[]} data 数据
   * @return {object[]} mongodb返回的ID
   */
  mfmongodb.insertMany = async (col, data) => {
    const insertData = await mongodb.collection(col).insertMany(data);
    let result = [];
    if (insertData && insertData.result && insertData.result.n) {
      for (let i = 0; i < insertData.result.n; i++) {
        result.push(insertData.insertedIds[i]);
      }
    }
    return result;
  }

  /**
   * @description: 删除多条数据
   * @param {string} col 集合
   * @param {object} filter 过滤条件
   * @return {number} 删除的数量
   */
  mfmongodb.deleteMany = async (col, filter) => {
    let result = await mongodb.collection(col).deleteMany(filter);
    return result.deletedCount;
  }

  /**
   * @description: 更新数据
   * @param {string} col 集合
   * @param {object} filter 过滤条件
   * @param {object} data 数据
   * @return {number} 修改的数量
   */
  mfmongodb.updateMany = async (col, filter, data) => {
    let result = await mongodb.collection(col).updateMany(filter, data);
    return result.matchedCount;
  }

  /**
   * @description: 统计数据
   * @param {string} col 集合
   * @param {object} filter 过滤条件
   * @return {number} 统计数量
   */
  mfmongodb.count = async (col, filter) => {
    let result = await mongodb.collection(col).countDocuments(filter);
    return result;
  }

  /**
   * @description: 查询数据
   * @param {string} col 集合
   * @param {object} filter 过滤条件
   * @param {object} sort 排序规则, key是排序名字，value是1或-1 {_id: 1}
   * @param {number} skip 跳过的文档数量 分页查询使用
   * @param {number} limit 查询的文档数量限制
   * @return {number} 统计数量 
   */
  mfmongodb.find = async (col, filter, sort, skip = 0, limit) => {
    let findData = await mongodb.collection(col).find(filter);
    if (sort) findData = findData.sort(sort);
    if (skip) findData = findData.skip(skip);
    if (limit) findData = findData.limit(limit);
    const result = findData.toArray();
    return result;
  }

  return mfmongodb;
}